#include "LinkList.h"

int main(void)
{
	LinkList pHead = NULL;
	
	int i = 0; 
	int len = 0;   //存放L中元素的个数
	ElemType val = 0;   //存放临时变量
	ElemType e = 0, cur_e = 0, pre_e = 0, next_e = 0;

	//初始化
	pHead = InitList();

	//判空
	if (ListEmpty)
	{
		printf("单链表为空!\n");
	}
	else
	{
		printf("单链表不为空.\n");
	}

	//创建单链表
	//CreateList_H(pHead);//头插法(前插法)创建单链表
	CreateList_R(pHead);//尾插法(后插法)创建单链表
	//遍历
	TraverseList(pHead);
	//显示链表中的元素个数
	printf("链表L中共%d个元素\n", ListLength(pHead));
	printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");

	//排序(升序)
	SortList(pHead);
	printf("排序(升序)后的遍历为:>");
	TraverseList(pHead);   //遍历
	printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");

	//用e返回L中第i个数据元素的值.(初始条件:线性表已存在,且1 ≤ i ≤ ListLength(L))
	for (i = 1; i <= ListLength(pHead); i++)
	{
		printf("L的第%d的个元素是%c\n", i, e = GetElem(pHead, i, e));
	}
	printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");

	//返回L中第1个与e相同的允许在L中的位置。若这样的元素不存在，则返回值为0
	e = 'a';
	if (LocateElem(pHead, e))
	{
		printf("L中的第%d个元素与\"e = %c\"相同\n", LocateElem(pHead, e), e);
	}
	else
	{
		printf("这样的元素不存在\n");
	}
	e = 'b';
	if (LocateElem(pHead, e))
	{
		printf("L中的第%d个元素与\"e = %c\"相同\n", LocateElem(pHead, e), e);
	}
	else
	{
		printf("这样的元素不存在\n");
	}
	e = 'c';
	if (LocateElem(pHead, e))
	{
		printf("L中的第%d个元素与\"e = %c\"相同\n", LocateElem(pHead, e), e);
	}
	else
	{
		printf("这样的元素不存在\n");
	}
	e = 'd';
	if (LocateElem(pHead, e))
	{
		printf("L中的第%d个元素与\"e = %c\"相同\n", LocateElem(pHead, e), e);
	}
	else
	{
		printf("这样的元素不存在\n");
	}
	e = 'e';
	if (LocateElem(pHead, e))
	{
		printf("L中的第%d个元素与\"e = %c\"相同\n", LocateElem(pHead, e), e);
	}
	else
	{
		printf("这样的元素不存在\n");
	}
	e = 'f';
	if (LocateElem(pHead, e))
	{
		printf("L中的第%d个元素与\"e = %c\"相同\n", LocateElem(pHead, e), e);
	}
	else
	{
		printf("这样的元素不存在\n");
	}
	printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");

	//若cur_e是L的数据元素,且不是第一个，则用pre_e返回其前驱,否则操作失败,pre_e无定义
	cur_e = 'a';
	pre_e = PriorElem(pHead, cur_e, &pre_e);
	if (pre_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是第一个),其前驱为 %c\n", cur_e, pre_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'b';
	pre_e = PriorElem(pHead, cur_e, &pre_e);
	if (pre_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是第一个),其前驱为 %c\n", cur_e, pre_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'c';
	pre_e = PriorElem(pHead, cur_e, &pre_e);
	if (pre_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是第一个),其前驱为 %c\n", cur_e, pre_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'd';
	pre_e = PriorElem(pHead, cur_e, &pre_e);
	if (pre_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是第一个),其前驱为 %c\n", cur_e, pre_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'e';
	pre_e = PriorElem(pHead, cur_e, &pre_e);
	if (pre_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是第一个),其前驱为 %c\n", cur_e, pre_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'f';
	pre_e = PriorElem(pHead, cur_e, &pre_e);
	if (pre_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是第一个),其前驱为 %c\n", cur_e, pre_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");

	//若cur_e是L的数据元素，且不是最后一个，则用next_e返回其后继，否则操作失败，next_e无定义
	cur_e = 'a';
	next_e= NextElem(pHead, cur_e, next_e);
	if (next_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是最后一个),其后继为 %c\n", cur_e, next_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'b';
	next_e = NextElem(pHead, cur_e, next_e);
	if (next_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是最后一个),其后继为 %c\n", cur_e, next_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'c';
	next_e = NextElem(pHead, cur_e, next_e);
	if (next_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是最后一个),其后继为 %c\n", cur_e, next_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'd';
	next_e = NextElem(pHead, cur_e, next_e);
	if (next_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是最后一个),其后继为 %c\n", cur_e, next_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'e';
	next_e = NextElem(pHead, cur_e, next_e);
	if (next_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是最后一个),其后继为 %c\n", cur_e, next_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	cur_e = 'f';
	next_e = NextElem(pHead, cur_e, next_e);
	if (next_e)
	{
		printf("\"cur_e = %c\"是L的数据元素(且不是最后一个),其后继为 %c\n", cur_e, next_e);
	}
	else
	{
		printf("操作失败!\n");
	}
	printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");

	//在L中第i个位置之前插入新的数据元素e，L的长度+1
	printf("当前L中共有 %d 个元素\n", ListLength(pHead));
	TraverseList(pHead);
	printf("\n");
	printf("你想在第几个元素之前插入新的元素:>");
	scanf("%d", &i);
	getchar();
	while (i<1 || i>ListLength(pHead))
	{
		printf("\n超出L中元素总个数范围!\n请重新输入位置:>\n");
		printf("当前L中共有 %d 个元素\n", ListLength(pHead));
		printf("你想在第几个元素之前插入新的元素:>");
		scanf("%d", &i);
		getchar();
	}
	printf("请输入要插入的元素为:>");
	scanf("%c", &e);
	getchar();
	ListInsert(pHead, i, e);
	TraverseList(pHead);   //遍历
	len = ListLength(pHead);
	printf("L中元素的个数为 %d\n", len);   //L中元素个数
	printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");

	//删除L的第i个元素，L的长度-1
	printf("当前L中共有 %d 个元素\n", ListLength(pHead));
	TraverseList(pHead);
	printf("\n");
	printf("您要删除第几位元素:>");
	scanf("%d", &i);
	getchar();
	while (i<1 || i>ListLength(pHead))
	{
		printf("\n超出L中元素总个数范围!\n请重新输入位置:>\n");
		printf("你要删除第几位元素:>");
		scanf("%d", &i);
		getchar();
	}
	ListDelete(pHead, i);
	TraverseList(pHead);   //遍历
	len = ListLength(pHead);
	printf("L中元素的个数为 %d", len);   //L中元素个数
	printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");

	//置空
	ClearList(pHead);
	if(NULL == pHead->next)
	{
		printf("链表L已置空!\n");
	}
	else
	{
		printf("操作失败!链表L未置空\n");
	}
	printf("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n");
	
	//销毁
	DestroyList(pHead);

	return 0;
}